import logging  # 导入Python标准库中的日志模块
import os  # 导入操作系统接口模块
import time  # 导入时间处理模块
from pathlib import Path  # 导入路径处理模块，提供面向对象的文件系统路径处理
from config.conf import BASE_DIR  # 从配置文件导入项目根目录路径
import colorlog  # 导入彩色日志模块，用于控制台彩色输出

# 定义日志级别对应的颜色配置
log_colors_config = {
    'DEBUG': 'white',      # 调试信息显示为白色
    'INFO': 'green',       # 一般信息显示为绿色
    'WARNING': 'yellow',   # 警告信息显示为黄色
    'ERROR': 'red',        # 错误信息显示为红色
    'CRITICAL': 'bold_red',# 严重错误显示为粗体红色
}

# 创建日志记录器
log = logging.getLogger('log_name')  # 创建一个名为'log_name'的日志记录器

# 设置日志记录器的最低级别为DEBUG
log.setLevel(logging.DEBUG)  # 设置后，DEBUG及以上级别的日志都会被记录

# 确保处理器只被添加一次，避免重复添加
if not log.handlers:
    # 创建并配置控制台处理器（在控制台显示彩色日志）
    console_handler = logging.StreamHandler()  # 创建控制台处理器
    console_handler.setLevel(logging.DEBUG)    # 设置控制台处理器的级别为DEBUG
    
    # 创建彩色日志格式器，定义控制台输出格式
    console_formatter = colorlog.ColoredFormatter(
        # 定义日志格式：级别、时间、消息内容、文件名、函数名、行号
        fmt='%(log_color)s[%(levelname)s] [%(asctime)s.%(msecs)03d] : %(message)s %(filename)s -> %(funcName)s line:%(lineno)d',
        datefmt='%Y-%m-%d %H:%M:%S',  # 定义时间格式
        log_colors=log_colors_config   # 使用前面定义的颜色配置
    )
    console_handler.setFormatter(console_formatter)  # 将格式器应用到控制台处理器
    log.addHandler(console_handler)    # 将控制台处理器添加到日志记录器

    # 创建并配置文件处理器（将日志写入文件）
    log_dir = Path(BASE_DIR) / 'log'   # 构建日志目录路径
    log_dir.mkdir(parents=True, exist_ok=True)  # 创建日志目录，如果不存在则创建
    # 构建日志文件路径，文件名包含当前日期
    file_path = log_dir / f'run_log_{time.strftime("%Y-%m-%d")}.log'

    # 创建文件处理器
    file_handler = logging.FileHandler(
        filename=file_path,    # 日志文件路径
        encoding='utf-8',      # 使用UTF-8编码
        mode='a'               # 追加模式写入
    )
    file_handler.setLevel(logging.INFO)  # 设置文件处理器的级别为INFO
    
    # 创建文件日志格式器，定义文件中日志的格式（不带颜色）
    file_formatter = logging.Formatter(
        fmt='[%(levelname)s] [%(asctime)s.%(msecs)03d] : %(message)s %(filename)s -> %(funcName)s line:%(lineno)d',
        datefmt='%Y-%m-%d %H:%M:%S'
    )
    file_handler.setFormatter(file_formatter)  # 将格式器应用到文件处理器
    log.addHandler(file_handler)  # 将文件处理器添加到日志记录器

# 测试代码，只有在直接运行此文件时才会执行
if __name__ == '__main__':
    # 测试不同级别的日志记录
# 记录不同级别的日志
    log.debug("调试信息")  # 开发调试时使用
    log.info("操作信息")   # 记录正常操作
    log.warning("警告信息") # 记录警告
    log.error("错误信息")   # 记录错误
    log.critical("严重错误") # 记录严重错误